package com.trainoo.crawler.demo;

import com.trainoo.novelReader.chapterParser.TitleMatches;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Pattern;

/**
 * Created by Administrator on 2018/5/29.
 */
public class MyCrawler extends WebCrawler {

    private static Logger LOG = LoggerFactory.getLogger(MyCrawler.class);
    private static String rootUrl = "http://www.6mao.com";

    /**
     * 正则匹配指定的后缀文件
     */
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"
            + "|png|mp3|mp3|zip|gz))$");

    /**
     * 这个方法主要是决定哪些url我们需要抓取，返回true表示是我们需要的，返回false表示不是我们需要的Url
     * 第一个参数referringPage封装了当前爬取的页面信息
     * 第二个参数url封装了当前爬取的页面url信息
     */
    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase();  // 得到小写的url
        return !FILTERS.matcher(href).matches()    // 正则匹配，过滤掉我们不需要的后缀文件
                && href.startsWith(rootUrl);       // url必须是rootUrl开头，规定站点
    }

    /**
     * 当我们爬到我们需要的页面，这个方法会被调用，我们可以尽情的处理这个页面
     * page参数封装了所有页面信息
     */
    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();  // 获取url
        LOG.info("Url: {}", url);

        if (page.getParseData() instanceof HtmlParseData) {  // 判断是否是html数据
            HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); // 强制类型转换，获取html数据对象
            // Set<WebURL> links = htmlParseData.getOutgoingUrls();  // 获取页面输出链接

            Document doc = Jsoup.parse(htmlParseData.getHtml());
            Elements lieBiaoList = doc.getElementsByClass("liebiao_bottom").first()
                    .getElementsByTag("dl").first()
                    .getElementsByTag("dd");
            for( int i = 0; i < lieBiaoList.size(); i ++){
                Element element = lieBiaoList.get(i);
                String title = element.text();
                if (TitleMatches.isZhang(title) || TitleMatches.isExtra(title)) {
                    System.out.println(element.text());
                }
            }
        }
    }
}
